using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace AppManagement.MainManagers
{
	#region using
	using DevComponents.DotNetBar;
	using AppManagement.Models;
	using AppManagement.Repositories;
	using AppManagement.Helpers;
	using System.Data;
	using System.Drawing;
	using System.IO;
	#endregion

	public partial class FrmQuanLyHocPhan : Office2007Form
	{
		public EventHandler Handler { get; set; }
		private DevComponents.DotNetBar.Controls.TextBoxX txtMaKhoa;

		public FrmQuanLyHocPhan(string makhoa, bool enableChon = false)
		{
			InitializeComponent();
            InitGridView();
            InitHiddenFields();
            btnChon.Enabled = enableChon;
            txtMaKhoa.Text = makhoa;
            txtKhoa.Text = KhoaRepository.SelectByID(int.Parse(makhoa)).TenKhoa;
		}

		private void FrmQuanLyHocPhan_Load(object sender, EventArgs e)
		{
			LoadData();
			dtgvData.ClearSelection();
		}

		private void btnChon_Click(object sender, EventArgs e)
		{
			var errorText = "";
			if (!ValidateInput(EnumUpdateMode.CHOOSING, ref errorText))
			{
				MessageBox.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			var id = int.Parse(txtMaHP.Text);
			var name = HocPhanRepository.SelectByID(id).TenHP;
			TransferDataInfo(this, new TransferSimpleDataEvent(id + "#" + name));
		}

		private void btnThem_Click(object sender, EventArgs e)
		{
			var errorText = "";
			if (!ValidateInput(EnumUpdateMode.INSERT, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (ActionAdd())
			{
				MessageBoxEx.Show("Lưu dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
				LoadData();
				btnReset_Click(sender, e);
			}
			else
			{
				MessageBoxEx.Show("Lưu dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

		private void btnXoa_Click(object sender, EventArgs e)
		{
			var errorText = "";
			if (!ValidateInput(EnumUpdateMode.DELETE, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (MessageBoxEx.Show("Bạn có chắc chắn xóa dòng này không?", "Xóa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
			{
				if (ActionDelete())
				{
					MessageBoxEx.Show("Xóa dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
					LoadData();
					btnReset_Click(sender, e);
				}
				else
				{
					MessageBoxEx.Show("Xóa dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				}
			}
		}

		private void btnCapNhat_Click(object sender, EventArgs e)
		{
			var errorText = "";
			if (!ValidateInput(EnumUpdateMode.UPDATE, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (ActionUpdate())
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
				LoadData();
			}
			else
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

		private void btnThoat_Click(object sender, EventArgs e)
		{
			this.Close();
		}

		private void btnReset_Click(object sender, EventArgs e)
		{
			txtMaHP.Text = "";
			txtTenHP.Text = "";
			txtSoTC.Text = "";
			txtSoTietLT.Text = "";
			txtSoTietTH.Text = "";
			txtSoTietTuHoc.Text = "";
		}

		private void dtgvData_CellClick(object sender, DataGridViewCellEventArgs e)
		{
			if (dtgvData.SelectedRows == null || dtgvData.SelectedRows.Count == 0)
				return;
			var selectedItem = dtgvData.SelectedRows[0];
			txtMaHP.Text = dtgvData.SelectedRows[0].Cells["MaHP"].Value.ToString();
			var item = HocPhanRepository.SelectByID(int.Parse(txtMaHP.Text));
			LoadDetailInfo(item);
		}

		public void LoadDetailInfo(HocPhan item)
		{
			txtMaKhoa.Text = item.MaKhoa == null ? "" : item.MaKhoa.ToString();
			txtKhoa.Text = item.Khoa == null ? "" : item.Khoa.TenKhoa.ToString();
			txtTenHP.Text = item.TenHP == null ? "" : item.TenHP.ToString();
			txtSoTC.Text = item.SoTC == null ? "" : item.SoTC.ToString();
			txtSoTietLT.Text = item.SoTietLT == null ? "" : item.SoTietLT.ToString();
			txtSoTietTH.Text = item.SoTietTH == null ? "" : item.SoTietTH.ToString();
			txtSoTietTuHoc.Text = item.SoTietTuHoc == null ? "" : item.SoTietTuHoc.ToString();
		}

		private void InitGridView()
		{
			DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Mã HP",
				DataPropertyName = "MaHP",
				Name = "MaHP",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);

			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Tên HP",
				DataPropertyName = "TenHP",
				Name = "TenHP",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Số TC",
				DataPropertyName = "SoTC",
				Name = "SoTC",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Số tiết LT",
				DataPropertyName = "SoTietLT",
				Name = "SoTietLT",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Số tiết thực hành",
				DataPropertyName = "SoTietTH",
				Name = "SoTietTH",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Số tiết tự học",
				DataPropertyName = "SoTietTuHoc",
				Name = "SoTietTuHoc",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/6)) - 2
			};
			dtgvData.Columns.Add(objColumn);
		}

		public void InitHiddenFields()
		{
			txtMaKhoa = new DevComponents.DotNetBar.Controls.TextBoxX
			{
				Name = "txtMaKhoa",
				Text = ""
			};
			txtMaKhoa.Visible = false;
		}

		private void LoadData()
		{
			var lstItem = HocPhanRepository.SelectByMaKhoa(int.Parse(txtMaKhoa.Text));
			var dt = new DataTable();
			dt.Columns.Add("MaHP");
			dt.Columns.Add("TenHP");
			dt.Columns.Add("SoTC");
			dt.Columns.Add("SoTietLT");
			dt.Columns.Add("SoTietTH");
			dt.Columns.Add("SoTietTuHoc");
			for (int i = 0; i < lstItem.Count; i++)
			{
				dt.Rows.Add(lstItem[i].MaHP, lstItem[i].TenHP, lstItem[i].SoTC, lstItem[i].SoTietLT, lstItem[i].SoTietTH, lstItem[i].SoTietTuHoc);
			}
			DataView objTimeSheetDV = new System.Data.DataView(dt);
			objTimeSheetDV.AllowNew = false;
			dtgvData.AutoGenerateColumns = false;
			dtgvData.DataSource = objTimeSheetDV;
			dtgvData.ClearSelection();
		}

		private bool ValidateInput(EnumUpdateMode mode, ref string errorText)
		{
			if (mode == EnumUpdateMode.UPDATE || mode == EnumUpdateMode.DELETE)
			{
				if (txtMaHP.Text == "")
				{
					errorText = "Vui lòng chọn MaHP";
					return false;
				}
			}
			if (mode != EnumUpdateMode.DELETE)
			{
				if (txtMaKhoa.Text == "")
				{
					 errorText = "Vui lòng nhập MaKhoa";
					return false;
				}
				if (txtTenHP.Text == "")
				{
					 errorText = "Vui lòng nhập TenHP";
					return false;
				}
				if (txtSoTC.Text == "")
				{
					 errorText = "Vui lòng nhập SoTC";
					return false;
				}
				if (txtSoTietLT.Text == "")
				{
					 errorText = "Vui lòng nhập SoTietLT";
					return false;
				}
				if (txtSoTietTH.Text == "")
				{
					 errorText = "Vui lòng nhập SoTietTH";
					return false;
				}
				if (txtSoTietTuHoc.Text == "")
				{
					 errorText = "Vui lòng nhập SoTietTuHoc";
					return false;
				}
			}
			return true;
		}

		private bool ActionAdd()
		{
			try
			{
				var item = new HocPhan
				{
					MaKhoa = int.Parse(txtMaKhoa.Text),
					TenHP = txtTenHP.Text,
					SoTC = int.Parse(txtSoTC.Text),
					SoTietLT = int.Parse(txtSoTietLT.Text),
					SoTietTH = int.Parse(txtSoTietTH.Text),
					SoTietTuHoc = int.Parse(txtSoTietTuHoc.Text),
				};
				if (!HocPhanRepository.Insert(item))
				{
					return false;
				}
				return true;
			}
			catch
			{
				return false;
			}
		}

		private bool ActionUpdate()
		{
			try
			{
				var item = HocPhanRepository.SelectByID(int.Parse(txtMaHP.Text));
				item.MaKhoa = int.Parse(txtMaKhoa.Text);
				item.TenHP = txtTenHP.Text;
				item.SoTC = int.Parse(txtSoTC.Text);
				item.SoTietLT = int.Parse(txtSoTietLT.Text);
				item.SoTietTH = int.Parse(txtSoTietTH.Text);
				item.SoTietTuHoc = int.Parse(txtSoTietTuHoc.Text);
				return HocPhanRepository.Save();
			}
			catch
			{
				return false;
			}
		}

		private bool ActionDelete()
		{
			try
			{
				return HocPhanRepository.Delete(int.Parse(txtMaHP.Text));
			}
			catch
			{
				return false;
			}
		}

		public void TransferDataInfo(object sender, TransferSimpleDataEvent e)
		{
			this.Close();
			this.Handler(this, e);
		}

		private void btnChonKhoa_Click(object sender, EventArgs e)
		{
			FrmQuanLyKhoa frm = new FrmQuanLyKhoa(true);
			frm.Handler += GetKhoa;
			frm.ShowDialog();
		}

		public void GetKhoa(object sender, EventArgs e)
		{
			var eventType = (TransferSimpleDataEvent)e;
			string[] comp = eventType.Data.Split(new char[] { '#' });
			txtMaKhoa.Text = comp[0];
			txtKhoa.Text = comp[1];
		}



	}

}
